{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 线性回归\n",
    "## 1.1 简单例子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import linear_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = [[0, 0], [1, 1], [2, 2]]\n",
    "y = [0, 1, 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg = linear_model.LinearRegression()\n",
    "reg.fit (X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.5, 0.5])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3.])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg.predict([[3,3]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.2 糖尿病数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from sklearn import datasets, linear_model\n",
    "from sklearn.metrics import mean_squared_error, r2_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 载入数据集\n",
    "diabetes = datasets.load_diabetes()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.06169621],\n",
       "       [-0.05147406],\n",
       "       [ 0.04445121],\n",
       "       [-0.01159501],\n",
       "       [-0.03638469],\n",
       "       [-0.04069594],\n",
       "       [-0.04716281],\n",
       "       [-0.00189471],\n",
       "       [ 0.06169621],\n",
       "       [ 0.03906215],\n",
       "       [-0.08380842],\n",
       "       [ 0.01750591],\n",
       "       [-0.02884001],\n",
       "       [-0.00189471],\n",
       "       [-0.02560657],\n",
       "       [-0.01806189],\n",
       "       [ 0.04229559],\n",
       "       [ 0.01211685],\n",
       "       [-0.0105172 ],\n",
       "       [-0.01806189],\n",
       "       [-0.05686312],\n",
       "       [-0.02237314],\n",
       "       [-0.00405033],\n",
       "       [ 0.06061839],\n",
       "       [ 0.03582872],\n",
       "       [-0.01267283],\n",
       "       [-0.07734155],\n",
       "       [ 0.05954058],\n",
       "       [-0.02129532],\n",
       "       [-0.00620595],\n",
       "       [ 0.04445121],\n",
       "       [-0.06548562],\n",
       "       [ 0.12528712],\n",
       "       [-0.05039625],\n",
       "       [-0.06332999],\n",
       "       [-0.03099563],\n",
       "       [ 0.02289497],\n",
       "       [ 0.01103904],\n",
       "       [ 0.07139652],\n",
       "       [ 0.01427248],\n",
       "       [-0.00836158],\n",
       "       [-0.06764124],\n",
       "       [-0.0105172 ],\n",
       "       [-0.02345095],\n",
       "       [ 0.06816308],\n",
       "       [-0.03530688],\n",
       "       [-0.01159501],\n",
       "       [-0.0730303 ],\n",
       "       [-0.04177375],\n",
       "       [ 0.01427248],\n",
       "       [-0.00728377],\n",
       "       [ 0.0164281 ],\n",
       "       [-0.00943939],\n",
       "       [-0.01590626],\n",
       "       [ 0.0250506 ],\n",
       "       [-0.04931844],\n",
       "       [ 0.04121778],\n",
       "       [-0.06332999],\n",
       "       [-0.06440781],\n",
       "       [-0.02560657],\n",
       "       [-0.00405033],\n",
       "       [ 0.00457217],\n",
       "       [-0.00728377],\n",
       "       [-0.0374625 ],\n",
       "       [-0.02560657],\n",
       "       [-0.02452876],\n",
       "       [-0.01806189],\n",
       "       [-0.01482845],\n",
       "       [-0.02991782],\n",
       "       [-0.046085  ],\n",
       "       [-0.06979687],\n",
       "       [ 0.03367309],\n",
       "       [-0.00405033],\n",
       "       [-0.02021751],\n",
       "       [ 0.00241654],\n",
       "       [-0.03099563],\n",
       "       [ 0.02828403],\n",
       "       [-0.03638469],\n",
       "       [-0.05794093],\n",
       "       [-0.0374625 ],\n",
       "       [ 0.01211685],\n",
       "       [-0.02237314],\n",
       "       [-0.03530688],\n",
       "       [ 0.00996123],\n",
       "       [-0.03961813],\n",
       "       [ 0.07139652],\n",
       "       [-0.07518593],\n",
       "       [-0.00620595],\n",
       "       [-0.04069594],\n",
       "       [-0.04824063],\n",
       "       [-0.02560657],\n",
       "       [ 0.0519959 ],\n",
       "       [ 0.00457217],\n",
       "       [-0.06440781],\n",
       "       [-0.01698407],\n",
       "       [-0.05794093],\n",
       "       [ 0.00996123],\n",
       "       [ 0.08864151],\n",
       "       [-0.00512814],\n",
       "       [-0.06440781],\n",
       "       [ 0.01750591],\n",
       "       [-0.04500719],\n",
       "       [ 0.02828403],\n",
       "       [ 0.04121778],\n",
       "       [ 0.06492964],\n",
       "       [-0.03207344],\n",
       "       [-0.07626374],\n",
       "       [ 0.04984027],\n",
       "       [ 0.04552903],\n",
       "       [-0.00943939],\n",
       "       [-0.03207344],\n",
       "       [ 0.00457217],\n",
       "       [ 0.02073935],\n",
       "       [ 0.01427248],\n",
       "       [ 0.11019775],\n",
       "       [ 0.00133873],\n",
       "       [ 0.05846277],\n",
       "       [-0.02129532],\n",
       "       [-0.0105172 ],\n",
       "       [-0.04716281],\n",
       "       [ 0.00457217],\n",
       "       [ 0.01750591],\n",
       "       [ 0.08109682],\n",
       "       [ 0.0347509 ],\n",
       "       [ 0.02397278],\n",
       "       [-0.00836158],\n",
       "       [-0.06117437],\n",
       "       [-0.00189471],\n",
       "       [-0.06225218],\n",
       "       [ 0.0164281 ],\n",
       "       [ 0.09618619],\n",
       "       [-0.06979687],\n",
       "       [-0.02129532],\n",
       "       [-0.05362969],\n",
       "       [ 0.0433734 ],\n",
       "       [ 0.05630715],\n",
       "       [-0.0816528 ],\n",
       "       [ 0.04984027],\n",
       "       [ 0.11127556],\n",
       "       [ 0.06169621],\n",
       "       [ 0.01427248],\n",
       "       [ 0.04768465],\n",
       "       [ 0.01211685],\n",
       "       [ 0.00564998],\n",
       "       [ 0.04660684],\n",
       "       [ 0.12852056],\n",
       "       [ 0.05954058],\n",
       "       [ 0.09295276],\n",
       "       [ 0.01535029],\n",
       "       [-0.00512814],\n",
       "       [ 0.0703187 ],\n",
       "       [-0.00405033],\n",
       "       [-0.00081689],\n",
       "       [-0.04392938],\n",
       "       [ 0.02073935],\n",
       "       [ 0.06061839],\n",
       "       [-0.0105172 ],\n",
       "       [-0.03315126],\n",
       "       [-0.06548562],\n",
       "       [ 0.0433734 ],\n",
       "       [-0.06225218],\n",
       "       [ 0.06385183],\n",
       "       [ 0.03043966],\n",
       "       [ 0.07247433],\n",
       "       [-0.0191397 ],\n",
       "       [-0.06656343],\n",
       "       [-0.06009656],\n",
       "       [ 0.06924089],\n",
       "       [ 0.05954058],\n",
       "       [-0.02668438],\n",
       "       [-0.02021751],\n",
       "       [-0.046085  ],\n",
       "       [ 0.07139652],\n",
       "       [-0.07949718],\n",
       "       [ 0.00996123],\n",
       "       [-0.03854032],\n",
       "       [ 0.01966154],\n",
       "       [ 0.02720622],\n",
       "       [-0.00836158],\n",
       "       [-0.01590626],\n",
       "       [ 0.00457217],\n",
       "       [-0.04285156],\n",
       "       [ 0.00564998],\n",
       "       [-0.03530688],\n",
       "       [ 0.02397278],\n",
       "       [-0.01806189],\n",
       "       [ 0.04229559],\n",
       "       [-0.0547075 ],\n",
       "       [-0.00297252],\n",
       "       [-0.06656343],\n",
       "       [-0.01267283],\n",
       "       [-0.04177375],\n",
       "       [-0.03099563],\n",
       "       [-0.00512814],\n",
       "       [-0.05901875],\n",
       "       [ 0.0250506 ],\n",
       "       [-0.046085  ],\n",
       "       [ 0.00349435],\n",
       "       [ 0.05415152],\n",
       "       [-0.04500719],\n",
       "       [-0.05794093],\n",
       "       [-0.05578531],\n",
       "       [ 0.00133873],\n",
       "       [ 0.03043966],\n",
       "       [ 0.00672779],\n",
       "       [ 0.04660684],\n",
       "       [ 0.02612841],\n",
       "       [ 0.04552903],\n",
       "       [ 0.04013997],\n",
       "       [-0.01806189],\n",
       "       [ 0.01427248],\n",
       "       [ 0.03690653],\n",
       "       [ 0.00349435],\n",
       "       [-0.07087468],\n",
       "       [-0.03315126],\n",
       "       [ 0.09403057],\n",
       "       [ 0.03582872],\n",
       "       [ 0.03151747],\n",
       "       [-0.06548562],\n",
       "       [-0.04177375],\n",
       "       [-0.03961813],\n",
       "       [-0.03854032],\n",
       "       [-0.02560657],\n",
       "       [-0.02345095],\n",
       "       [-0.06656343],\n",
       "       [ 0.03259528],\n",
       "       [-0.046085  ],\n",
       "       [-0.02991782],\n",
       "       [-0.01267283],\n",
       "       [-0.01590626],\n",
       "       [ 0.07139652],\n",
       "       [-0.03099563],\n",
       "       [ 0.00026092],\n",
       "       [ 0.03690653],\n",
       "       [ 0.03906215],\n",
       "       [-0.01482845],\n",
       "       [ 0.00672779],\n",
       "       [-0.06871905],\n",
       "       [-0.00943939],\n",
       "       [ 0.01966154],\n",
       "       [ 0.07462995],\n",
       "       [-0.00836158],\n",
       "       [-0.02345095],\n",
       "       [-0.046085  ],\n",
       "       [ 0.05415152],\n",
       "       [-0.03530688],\n",
       "       [-0.03207344],\n",
       "       [-0.0816528 ],\n",
       "       [ 0.04768465],\n",
       "       [ 0.06061839],\n",
       "       [ 0.05630715],\n",
       "       [ 0.09834182],\n",
       "       [ 0.05954058],\n",
       "       [ 0.03367309],\n",
       "       [ 0.05630715],\n",
       "       [-0.06548562],\n",
       "       [ 0.16085492],\n",
       "       [-0.05578531],\n",
       "       [-0.02452876],\n",
       "       [-0.03638469],\n",
       "       [-0.00836158],\n",
       "       [-0.04177375],\n",
       "       [ 0.12744274],\n",
       "       [-0.07734155],\n",
       "       [ 0.02828403],\n",
       "       [-0.02560657],\n",
       "       [-0.06225218],\n",
       "       [-0.00081689],\n",
       "       [ 0.08864151],\n",
       "       [-0.03207344],\n",
       "       [ 0.03043966],\n",
       "       [ 0.00888341],\n",
       "       [ 0.00672779],\n",
       "       [-0.02021751],\n",
       "       [-0.02452876],\n",
       "       [-0.01159501],\n",
       "       [ 0.02612841],\n",
       "       [-0.05901875],\n",
       "       [-0.03638469],\n",
       "       [-0.02452876],\n",
       "       [ 0.01858372],\n",
       "       [-0.0902753 ],\n",
       "       [-0.00512814],\n",
       "       [-0.05255187],\n",
       "       [-0.02237314],\n",
       "       [-0.02021751],\n",
       "       [-0.0547075 ],\n",
       "       [-0.00620595],\n",
       "       [-0.01698407],\n",
       "       [ 0.05522933],\n",
       "       [ 0.07678558],\n",
       "       [ 0.01858372],\n",
       "       [-0.02237314],\n",
       "       [ 0.09295276],\n",
       "       [-0.03099563],\n",
       "       [ 0.03906215],\n",
       "       [-0.06117437],\n",
       "       [-0.00836158],\n",
       "       [-0.0374625 ],\n",
       "       [-0.01375064],\n",
       "       [ 0.07355214],\n",
       "       [-0.02452876],\n",
       "       [ 0.03367309],\n",
       "       [ 0.0347509 ],\n",
       "       [-0.03854032],\n",
       "       [-0.03961813],\n",
       "       [-0.00189471],\n",
       "       [-0.03099563],\n",
       "       [-0.046085  ],\n",
       "       [ 0.00133873],\n",
       "       [ 0.06492964],\n",
       "       [ 0.04013997],\n",
       "       [-0.02345095],\n",
       "       [ 0.05307371],\n",
       "       [ 0.04013997],\n",
       "       [-0.02021751],\n",
       "       [ 0.01427248],\n",
       "       [-0.03422907],\n",
       "       [ 0.00672779],\n",
       "       [ 0.00457217],\n",
       "       [ 0.03043966],\n",
       "       [ 0.0519959 ],\n",
       "       [ 0.06169621],\n",
       "       [-0.00728377],\n",
       "       [ 0.00564998],\n",
       "       [ 0.05415152],\n",
       "       [-0.00836158],\n",
       "       [ 0.114509  ],\n",
       "       [ 0.06708527],\n",
       "       [-0.05578531],\n",
       "       [ 0.03043966],\n",
       "       [-0.02560657],\n",
       "       [ 0.10480869],\n",
       "       [-0.00620595],\n",
       "       [-0.04716281],\n",
       "       [-0.04824063],\n",
       "       [ 0.08540807],\n",
       "       [-0.01267283],\n",
       "       [-0.03315126],\n",
       "       [-0.00728377],\n",
       "       [-0.01375064],\n",
       "       [ 0.05954058],\n",
       "       [ 0.02181716],\n",
       "       [ 0.01858372],\n",
       "       [-0.01159501],\n",
       "       [-0.00297252],\n",
       "       [ 0.01750591],\n",
       "       [-0.02991782],\n",
       "       [-0.02021751],\n",
       "       [-0.05794093],\n",
       "       [ 0.06061839],\n",
       "       [-0.04069594],\n",
       "       [-0.07195249],\n",
       "       [-0.05578531],\n",
       "       [ 0.04552903],\n",
       "       [-0.00943939],\n",
       "       [-0.03315126],\n",
       "       [ 0.04984027],\n",
       "       [-0.08488624],\n",
       "       [ 0.00564998],\n",
       "       [ 0.02073935],\n",
       "       [-0.00728377],\n",
       "       [ 0.10480869],\n",
       "       [-0.02452876],\n",
       "       [-0.00620595],\n",
       "       [-0.03854032],\n",
       "       [ 0.13714305],\n",
       "       [ 0.17055523],\n",
       "       [ 0.00241654],\n",
       "       [ 0.03798434],\n",
       "       [-0.05794093],\n",
       "       [-0.00943939],\n",
       "       [-0.02345095],\n",
       "       [-0.0105172 ],\n",
       "       [-0.03422907],\n",
       "       [-0.00297252],\n",
       "       [ 0.06816308],\n",
       "       [ 0.00996123],\n",
       "       [ 0.00241654],\n",
       "       [-0.03854032],\n",
       "       [ 0.02612841],\n",
       "       [-0.08919748],\n",
       "       [ 0.06061839],\n",
       "       [-0.02884001],\n",
       "       [-0.02991782],\n",
       "       [-0.0191397 ],\n",
       "       [-0.04069594],\n",
       "       [ 0.01535029],\n",
       "       [-0.02452876],\n",
       "       [ 0.00133873],\n",
       "       [ 0.06924089],\n",
       "       [-0.06979687],\n",
       "       [-0.02991782],\n",
       "       [-0.046085  ],\n",
       "       [ 0.01858372],\n",
       "       [ 0.00133873],\n",
       "       [-0.03099563],\n",
       "       [-0.00405033],\n",
       "       [ 0.01535029],\n",
       "       [ 0.02289497],\n",
       "       [ 0.04552903],\n",
       "       [-0.04500719],\n",
       "       [-0.03315126],\n",
       "       [ 0.097264  ],\n",
       "       [ 0.05415152],\n",
       "       [ 0.12313149],\n",
       "       [-0.08057499],\n",
       "       [ 0.09295276],\n",
       "       [-0.05039625],\n",
       "       [-0.01159501],\n",
       "       [-0.0277622 ],\n",
       "       [ 0.05846277],\n",
       "       [ 0.08540807],\n",
       "       [-0.00081689],\n",
       "       [ 0.00672779],\n",
       "       [ 0.00888341],\n",
       "       [ 0.08001901],\n",
       "       [ 0.07139652],\n",
       "       [-0.02452876],\n",
       "       [-0.0547075 ],\n",
       "       [-0.03638469],\n",
       "       [ 0.0164281 ],\n",
       "       [ 0.07786339],\n",
       "       [-0.03961813],\n",
       "       [ 0.01103904],\n",
       "       [-0.04069594],\n",
       "       [-0.03422907],\n",
       "       [ 0.00564998],\n",
       "       [ 0.08864151],\n",
       "       [-0.03315126],\n",
       "       [-0.05686312],\n",
       "       [-0.03099563],\n",
       "       [ 0.05522933],\n",
       "       [-0.06009656],\n",
       "       [ 0.00133873],\n",
       "       [-0.02345095],\n",
       "       [-0.07410811],\n",
       "       [ 0.01966154],\n",
       "       [-0.01590626],\n",
       "       [-0.01590626],\n",
       "       [ 0.03906215],\n",
       "       [-0.0730303 ]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 只取第三个属性进行一元回归\n",
    "diabetes_X = diabetes.data[:, np.newaxis, 2]\n",
    "diabetes_X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 划分训练集和测试集\n",
    "# 对特征进行划分\n",
    "diabetes_X_train = diabetes_X[:-20]\n",
    "diabetes_X_test = diabetes_X[-20:]\n",
    "\n",
    "# 对标签进行划分\n",
    "diabetes_y_train = diabetes.target[:-20]\n",
    "diabetes_y_test = diabetes.target[-20:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建模型对象\n",
    "regr = linear_model.LinearRegression()\n",
    "\n",
    "# 在训练集上训练模型\n",
    "regr.fit(diabetes_X_train, diabetes_y_train)\n",
    "\n",
    "# 在测试集上测试\n",
    "diabetes_y_pred = regr.predict(diabetes_X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Coefficients: \n",
      " [938.23786125]\n",
      "Mean squared error: 2548.07\n",
      "Variance score: 0.47\n"
     ]
    }
   ],
   "source": [
    "# 查看回归系数\n",
    "print('Coefficients: \\n', regr.coef_)\n",
    "# MSE\n",
    "print(\"Mean squared error: %.2f\"\n",
    "      % mean_squared_error(diabetes_y_test, diabetes_y_pred))\n",
    "# 解释方差R^2\n",
    "print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘图查看预测结果\n",
    "plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')\n",
    "plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)\n",
    "\n",
    "plt.xticks(())\n",
    "plt.yticks(())\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 回归树"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1 简单例子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = [[0, 0], [1, 1], [2, 2]]\n",
    "y = [0, 1, 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "dt_reg_test = tree.DecisionTreeRegressor()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "dt_reg_test = dt_reg_test.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt_reg_test.predict([[1, 1]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 生成的随机数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.tree import DecisionTreeRegressor\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成数据集，并加入随机误差\n",
    "rng = np.random.RandomState(1)\n",
    "X = np.sort(5 * rng.rand(80, 1), axis=0)\n",
    "y = np.sin(X).ravel()\n",
    "y[::5] += 3 * (0.5 - rng.rand(16))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeRegressor(criterion='mse', max_depth=5, max_features=None,\n",
       "           max_leaf_nodes=None, min_impurity_decrease=0.0,\n",
       "           min_impurity_split=None, min_samples_leaf=1,\n",
       "           min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
       "           presort=False, random_state=None, splitter='best')"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用不同参数，分别拟合模型\n",
    "dt_regr_1 = DecisionTreeRegressor(max_depth=2)\n",
    "dt_regr_2 = DecisionTreeRegressor(max_depth=5)\n",
    "dt_regr_1.fit(X, y)\n",
    "dt_regr_2.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分别进行模型预测\n",
    "X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]\n",
    "y_1 = dt_regr_1.predict(X_test)\n",
    "y_2 = dt_regr_2.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制结果\n",
    "plt.figure()\n",
    "plt.scatter(X, y, s=20, edgecolor=\"black\",\n",
    "            c=\"darkorange\", label=\"data\")\n",
    "plt.plot(X_test, y_1, color=\"cornflowerblue\",\n",
    "         label=\"max_depth=2\", linewidth=2)\n",
    "plt.plot(X_test, y_2, color=\"yellowgreen\", label=\"max_depth=5\", linewidth=2)\n",
    "plt.xlabel(\"data\")\n",
    "plt.ylabel(\"target\")\n",
    "plt.title(\"Decision Tree Regression\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. k近邻回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import neighbors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成样本数据，并加入随机误差\n",
    "np.random.seed(0)\n",
    "X = np.sort(5 * np.random.rand(40, 1), axis=0)\n",
    "T = np.linspace(0, 5, 500)[:, np.newaxis]\n",
    "y = np.sin(X).ravel()\n",
    "\n",
    "# 加入随机误差\n",
    "y[::5] += 1 * (0.5 - np.random.rand(8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 拟合模型，并画图对比\n",
    "n_neighbors = 5\n",
    "\n",
    "for i, weights in enumerate(['uniform', 'distance']):\n",
    "    knn = neighbors.KNeighborsRegressor(n_neighbors, weights=weights)\n",
    "    y_ = knn.fit(X, y).predict(T)\n",
    "\n",
    "    plt.subplot(2, 1, i + 1)\n",
    "    plt.scatter(X, y, c='k', label='data')\n",
    "    plt.plot(T, y_, c='g', label='prediction')\n",
    "    plt.axis('tight')\n",
    "    plt.legend()\n",
    "    plt.title(\"KNeighborsRegressor (k = %i, weights = '%s')\" % \n",
    "              (n_neighbors,weights))\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
